Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V  < 1 2 3  
Reply to this topicStart new topic
> zabezpieczenie kodu przed kopiowaniem
RAFpl
post
Post #41





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 6.03.2006
Skąd: Włocławek

Ostrzeżenie: (0%)
-----


Zazwyczaj firmy kupują duże skrypty, a wtedy łatwo jest ukryć złośliwy kod tj. robiący to co jest przez nas pożądane, a mała przejrzystość kodu (brak komentarzy i wcięć) powoduje trudności dogrzebania się do odpowiednich linijek.
Jeżeli produkt będzie sprzedawany tylko firmą (wiemy kto miał dostęp do kodu naszego skryptu - kluczowy jest tutaj odbiorca usług ) i będzie składał się z licznych plików to jest szansa, że nikt nie będzie bawił się w kreatywne oszczędzanie kosztem nas ;].

Wracając jednak do naszego kodu ;]. Kod ten pobierałby aktualną datę serwera i dodawał po okresie instalacji określoną ilość dni, kiedy nie wyświetlany byłby błąd licencji ;].

Ewentualnie wysyłałby do naszej bazy potajemnie adres strony + plus czas zainstalowania, ale nie pokazywałby po skończeniu licencji żadnych błędów.
Później mielibyśmy argumentacje, że przypadkiem odkryliśmy nasz skrypt na ich stronie (wtedy nie uraczyliby nas grzebaniem w naszym kodzie ;] w przyszłości ).


Można także w skrypcie sprzedawanym jakoś ważną część silnika php includować z naszego serwera, ale tutaj jest problem bezpieczeństwa.

Ten post edytował RAFpl 15.03.2006, 02:53:20
Go to the top of the page
+Quote Post
carramba
post
Post #42





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 29.10.2003
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Jakiś czas temu napisałem taki projekt do ukrywania kodu php, zasada działania dokładnie taka sama jak POBS ale działanie lepsze, POBS wywala się w przypadku pracy z dużym projektem. Żadne rozwiązanie tego typu nie daje 100% pewności, że kod nie zostanie ukradziony, ale generalnie znacznie utrudnia sprawe. Soft był testowany w kilku przypadkach na dużych aplikacjach po kilkanście tysięcy zmiennych i generalnie nie było problemów.

http://www.turtle.dotproject.pl/
Go to the top of the page
+Quote Post
nasty
post
Post #43





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


jest kilka dobrych metod ale zaproponuje bezpaltne:

Bezpatny zammennikem dla zend encoder i ionCube jest eAccelerator ktury nie szyfruje kod tylko go kompiluje, co uniemozliwia decompulacje, to co do szyfrowania kody.
a co do za bezpieczeniem przed zmanato sprobuj ta metode.
niech guwny plik w twoim programie ktury zawsze ject 'includowany' mial w sobie nastepujace instrukcje:
1) musisz manualnie obliczyc wszyskie md5() plikow kture sa w twoim programie,
2) wpisac je do tego pliku
3) spawdzac czy sie zgadzaja z aktualnymi md5() pilkow i pokazac error w razie bledu
4) to wszysko bedzie skompilowane wiec nikt nie bedzie wiedzial o co chodzi


ps. sorki za muj plski, ale ja jest obcokrajowcem
Go to the top of the page
+Quote Post
akubiczek
post
Post #44





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.07.2004
Skąd: z neostrady

Ostrzeżenie: (0%)
-----


Cytat(nasty_psycho @ 27.05.2006, 13:22 ) *
ps. sorki za muj plski, ale ja jest obcokrajowcem


Terefere. Obcokrajowiec wbrew pozorom nie popełnia notorycznych błędów ortograficznych.

---
Masz jakieś spostrzeżenia, napisz to autorowi na PW.
Masz ochotę na ostrzeżenie to pisz dalej takie idiotyczne posty.
~mike_mech
Go to the top of the page
+Quote Post
rubin
post
Post #45





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 5.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Wroce jeszcze do IonCube.. najnowsza wersja jest w stanie funkcjonowac bez zadnego doinstalowywania bibliotek (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
Fakt, pelna wersja kosztuje nawet 300$ ale nie ma co sie oszukiwac jezeli robisz oprogramowanie warte 500zl to zwykle mieszanie kodu wystarczy, natomiast przy 5000zl trzeba zainwestowac (jednorazowo!).
Dla skapcow - mozna na ich stronie przeprowadzic kompilacje kodu online za smieszne pieniazki (kilka $).
Go to the top of the page
+Quote Post
mokry
post
Post #46





Grupa: Zarejestrowani
Postów: 374
Pomógł: 23
Dołączył: 3.06.2006
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Pozwolę się sobie zabrać głos w tym temacie:

Rozwiązanie, które proponuje nie jest darmowe ale za to najskuteczniejsze z jakim miałem do czynienia, nie było ich mało. Przejde do rzeczy:

Proponuje użyć programy Codelock firmy Website Creations Ltd, (http://www.websitecreations.co.nz/).
//to nie jest żadna reklama //
Osobiście używam tego programu i jest po prostu idealny. Pliki kodowane są nie do rozkodowania, blokuje debugery co zwiększa bezpieczeństwo skryptu), możliwośc działania skryptu przez ileś dni od poerwszego uruchomienia lub do pewnej konkretnej daty, hasło przy pierwszym uruchomieniu, lub bez hasła, blokadana na konkretne domeny lub IP, kompresja ZLIB i wiele innych.
Jeżeli po roku chcesz przedłużyć okres ważności skryptu podmienia się tylko plik licencji, którego nazwę ustalasz sam.

Co najlepsze: Skrypt nie wymaga żadnych dodatkowych bibliotek, a wszystko niezbędne ma już w pliku licencji (oczywiście zakodowane).

Ponadto sam program może jeszcze kodować HTML, kod php i HTML np w taki sposób:
<?php
eval(base64_decode('JGNvZGVsb2NrX2NvZGU9IlB6NDhQdzBLUHo0OFAxQklVQ0E9IjsgJGNvZGVsb2NrX2NvZGU9c3Ry
X3JlcGxhY2UoIkAiLCJDQWciLCAkY29kZWxvY2tfY29kZSk7ICRjb2RlbG9ja19jb2RlPXN0cl9yZXBsY
WNlKCIhIiwgIlc1IiwgJGNvZGVsb2NrX2NvZGUpOyAkY29kZWxvY2tfY29kZT1zdHJfcmVwbGFjZSgiKi
IsICJDQWdJIiwgJGNvZGVsb2NrX2NvZGUpOyAkY29kZWxvY2tfY29kZT1iYXNlNjRfZGVjb2RlKCRjb2R
lbG9ja19jb2RlKTsgZXZhbCgkY29kZWxvY2tfY29kZSk7IAo='));
?>

Poniżej daje link do paczki z zakodowanym phpinfo:
http://webdesign.bitmar.net/phpinfo.zip
Go to the top of the page
+Quote Post
carramba
post
Post #47





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 29.10.2003
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Tak jak mówiłem wcześniej, nie ma dobrych zabezpieczeń kodu php. Jeśli da się rozkodować Windowsa ( a da się ) to co dopiero php. Lepszym rozwiązaniem jest zendEncoder lub iCube ale to też nie daje 100% gwarancji że ktoś kto będzie uparty nie rozbroi naszych zabezpieczeń dla przykładku główne funkcje wspomnianego wyżej programu CodeLock :

  1. <?php
  2. function codelock_run($ciph,$key)
  3. { 
  4. $m=0; 
  5. $abc=''; 
  6.  
  7. for($i=0;$i<strlen($ciph);$i++)
  8. { 
  9. $c=substr($ciph,$i,1); 
  10. $dv=codelock_dec($c); 
  11. $dv=($dv-$m)/4; 
  12. $fb=decbin($dv); 
  13.  
  14. while(strlen($fb)<4)
  15. { 
  16. $fb='0'.$fb; 
  17. } 
  18.  
  19. $abc=$abc.$fb; 
  20. $m++; if($m>3){ $m=0; } 
  21. } 
  22.  
  23. $kl=0; 
  24. $pd=''; 
  25.  
  26. for($j=0;$j<strlen($abc);$j=$j+8)
  27. { 
  28. $c=substr($abc,$j,8); 
  29. $k=substr($key,$kl,1); 
  30. $dc=bindec($c); 
  31. $dc=$dc - strlen($key); 
  32. $c=chr($dc); $kl++; 
  33.  
  34. if($kl>=strlen($key)){ $kl=0; } 
  35.  
  36. $dc=ord($c)^ord($k); 
  37. $p=chr($dc); 
  38. $pd=$pd.$p; 
  39. } 
  40.  
  41. return $pd; 
  42.  
  43. }
  44.  
  45. function codelock_dec($codelock_v)
  46. { 
  47. switch($codelock_v) { 
  48. case 'A':$dv=0;break; 
  49. case 'B':$dv=1;break; 
  50. case 'C':$dv=2;break; 
  51. case 'D':$dv=3;break; 
  52. case 'E':$dv=4;break; 
  53. case 'F':$dv=5;break; 
  54. case 'G':$dv=6;break; 
  55. case 'H':$dv=7;break;
  56. case 'I':$dv=8;break; 
  57. case 'J':$dv=9;break; 
  58. case 'K':$dv=10;break; 
  59. case 'L':$dv=11;break; 
  60. case 'M':$dv=12;break; 
  61. case 'N':$dv=13;break; 
  62. case 'O':$dv=14;break; 
  63. case 'P':$dv=15;break; 
  64. case 'Q':$dv=16;break; 
  65. case 'R':$dv=17;break; 
  66. case 'S':$dv=18;break; 
  67. case 'T':$dv=19;break; 
  68. case 'U':$dv=20;break; 
  69. case 'V':$dv=21;break; 
  70. case 'W':$dv=22;break; 
  71. case 'X':$dv=23;break; 
  72. case 'Y':$dv=24;break; 
  73. case 'Z':$dv=25;break; 
  74. case 'a':$dv=26;break; 
  75. case 'b':$dv=27;break; 
  76. case 'c':$dv=28;break; 
  77. case 'd':$dv=29;break; 
  78. case 'e':$dv=30;break; 
  79. case 'f':$dv=31;break; 
  80. case 'g':$dv=32;break; 
  81. case 'h':$dv=33;break; 
  82. case 'i':$dv=34;break; 
  83. case 'j':$dv=35;break; 
  84. case 'k':$dv=36;break; 
  85. case 'l':$dv=37;break; 
  86. case 'm':$dv=38;break; 
  87. case 'n':$dv=39;break;
  88. case 'o':$dv=40;break; 
  89. case 'p':$dv=41;break; 
  90. case 'q':$dv=42;break; 
  91. case 'r':$dv=43;break; 
  92. case 's':$dv=44;break; 
  93. case 't':$dv=45;break; 
  94. case 'u':$dv=46;break; 
  95. case 'v':$dv=47;break; 
  96. case 'w':$dv=48;break;
  97. case 'x':$dv=49;break; 
  98. case 'y':$dv=50;break; 
  99. case 'z':$dv=51;break; 
  100. case '0':$dv=52;break; 
  101. case '1':$dv=53;break; 
  102. case '2':$dv=54;break; 
  103. case '3':$dv=55;break;
  104. case '4':$dv=56;break; 
  105. case '5':$dv=57;break; 
  106. case '6':$dv=58;break; 
  107. case '7':$dv=59;break; 
  108. case '8':$dv=60;break; 
  109. case '9':$dv=61;break; 
  110. case '+':$dv=62;break; 
  111. case '/':$dv=63;break; 
  112. case '=':$dv=64;break; 
  113. default: $dv=0;break; 
  114. } 
  115.  
  116. return $dv; 
  117. } 
  118.  
  119. function codelock_dec_int($codelock_decint_code,$codelock_calc_key) 
  120. {
  121. if ($codelock_calc_key == '') 
  122. { 
  123.  
  124. } else { 
  125.  
  126. $codelock_calc_key = base64_encode($codelock_calc_key); 
  127. $codelock_k1=substr($codelock_calc_key,0,1); 
  128. $codelock_k2=substr($codelock_calc_key,1,1); 
  129. $codelock_k3=substr($codelock_calc_key,2,1); 
  130. $codelock_decint_code = str_replace('$', '$codelock_k1', $codelock_decint_code); 
  131. $codelock_decint_code= str_replace('(', '$codelock_k2', $codelock_decint_code); 
  132. $codelock_decint_code=str_replace(')', '$codelock_k3', $codelock_decint_code); 
  133.  
  134. } 
  135.  
  136. $codelock_decint_code=base64_decode($codelock_decint_code);
  137.  
  138. return $codelock_decint_code; 
  139.  
  140. } 
  141. }
  142. ?>
Go to the top of the page
+Quote Post
nasty
post
Post #48





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Pogrzebalem troche w sieci i doszedlem do jednej refleksji:
Produkty zapezpieczajace skrypty php przed podgladem zrodla sa nie zbyt dobrym rowiazaniem (http://wwww.18yuan.com/), dlaczego ? dlatego bo za duzo ludzi grzebalo w nich, prawie karzdy kiedzys mial stycznisc z kodem zabespieczonym w ten sposob, dlatego napewno ktos staral sie to zalamac, i pewnie kilku sie udalo ( nie zabezpieczenia bez crack-u !). i moim zdaniem najlepszym sposobem ukrywania kodu jest polaczenie php + jakis c/c++ itp. wtedy php bedzie uzywac system() aby uzyskac swoj source programy i then exe bedzie mu go dawal, ale to rowiazanie jest dla bardzo zaawansowanych, i gwarantuje lepszy poziom bezpieczenstwa.

Drugi sposob, jest takrze bezpieczny are trzeba durzego bandwidtha do tego: zamiast stawiac kody na kompie klienta i sciagac klucz szyfry z twojego serwera, mozesz posunac sie o krok dalej i urzyc WebServices, ktore beda wykonywaly te najbardziej "tajemnicze" funkcje, a reszte operacji ja np: (echo, itd. itp) to na lokalnym kompie klienta bedzie, to rozwiazanie ma kilka zalet:
1) pelna kontrola execucji
2) na 100% kod nie zostanie skradziony.
3) klient ni musi sciagac update tylko ty zmieniasz kod u siebie

wady:
1) zre bandwidth jak cholera
2) nie kazdy ma internet (np. intranet)
3) niektuzy nie maja zaufania to tego typu dzialanosci...

Ten post edytował nasty_psycho 7.06.2006, 22:59:04
Go to the top of the page
+Quote Post
NuLL
post
Post #49





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Wady:
4) Ktos moze sobie dopisac brakujacy kod.
Go to the top of the page
+Quote Post
bigZbig
post
Post #50





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


O dopisywanie brakujacego kodu az tak bardzo bym sie nie martwil bo skoro dopisze to juz nie ukradnie. Za to dostrzegam inna wade. Funkcjonowanie strony zbudowanej o tak zorganizowany skrypt zalezy od poprawnego funkcjonowania nie tylko serwera na ktorym jest umieszczona, ale tez od serwera uslugodawcy. Podwojenie awaryjnosci.
Go to the top of the page
+Quote Post
nasty
post
Post #51





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Cytat
zre bandwidth jak cholera


To sa wlasnie nastepstwa nadciagnietego bandwidtha...
Go to the top of the page
+Quote Post
Ludvik
post
Post #52





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Nie napisałeś o najważniejszej wadzie - czasie wykonania. Nawet przy najszybszych łączach szybkość takiej strony będzie kiepska. Ogólnie, to nie jest najlepsze rozwiązanie, bo jeszcze trzeba opłacić serwer, który to utrzyma. Jeżeli już mamy działający serwer, można pójść krok dalej i żądania wykonywać z przeglądarki klienta, ale to nie będzie miało nic wspólnego z tematem...
Go to the top of the page
+Quote Post
NetJaro
post
Post #53





Grupa: Zarejestrowani
Postów: 475
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ja polecam ionCube. Oczywiście płatny, płacisz za oprogramowanie do kodowania. Ma bardzo dużo możliwości kodowania!. Jego największą zaletą jest to, że nie trzeba instalowac żadnych dodatkowych modułów (bibliotek) do serwera - aby skrypt działał wystarczy wgrac folder z odpowiednimi plikami (kilka plików .php ale mozna usunąc zbędne i kilka plików jako do wczytania przez chyba funkcję system()) Na prawdę opłaca się zakupic.. Osobiście zakupiłem ich licencję i nie żałuję tego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Na prawdę jestem pod wielkim wrażeniem. Jak ktoś chciałby się pobawic tym (może coś zakodowac ;-) ) zapraszam na PW.

Pozdrawiam.

Ten post edytował NetJaro 18.06.2006, 07:57:40
Go to the top of the page
+Quote Post
nasty
post
Post #54





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Cytat
Jego największą zaletą jest to, że nie trzeba instalowac żadnych dodatkowych modułów do serwera - aby skrypt działał wystarczy wgrac folder z odpowiednimi plikami (kilka plików .php ale mozna usunąc zbędne i kilka plików jako do wczytania przez funkcję typu dl()


wlasnie ze trzeba bo dl() nie dziala wszedzie, trzeba specjalnie zainstalowac apache zeby dziala, a pozatym jest kilka dekoderow dla ionCube sieci.
Go to the top of the page
+Quote Post
NetJaro
post
Post #55





Grupa: Zarejestrowani
Postów: 475
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Mało który usługodawca blokuje funkcję.. kiedyś to była podstawa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

A co do dekoderów - znajdź mi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ja znalazłem jeden gdzie koszt wynosił 20€ - sprawdziłem, opłaciłem i gościa nie ma, kasy nie ma a tym bardziej skryptu odkodowanego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
splatch
post
Post #56





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(NetJaro @ 18.06.2006, 08:53 ) *
Ja polecam ionCube. Oczywiście płatny, płacisz za oprogramowanie do kodowania. Ma bardzo dużo możliwości kodowania!. Jego największą zaletą jest to, że nie trzeba instalowac żadnych dodatkowych modułów (bibliotek) do serwera - aby skrypt działał wystarczy wgrac folder z odpowiednimi plikami (kilka plików .php ale mozna usunąc zbędne i kilka plików jako do wczytania przez chyba funkcję system()


Cytat(NetJaro @ 18.06.2006, 12:17 ) *
Mało który usługodawca blokuje funkcję.. kiedyś to była podstawa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

A co do dekoderów - znajdź mi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ja znalazłem jeden gdzie koszt wynosił 20€ - sprawdziłem, opłaciłem i gościa nie ma, kasy nie ma a tym bardziej skryptu odkodowanego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Nie znam administratora, który zostawia system(), exec() niezablokowane. Bardzo niewiele serwerów ma tą opcję włączoną. W poprzedniej pracy administrator nie dopuszczał użycia żadnej z tych funkcji nawet na serwerze testowym. Nie mówie już o dl() ponieważ ta funkcja jest domyślnie wyłączona i w przyszłości (PHP6) jej nie będzie, tzn. będzie dostępna tylko w CLI, zatem w grę będzie wchodzić modyfikacja php.ini. Dlatego też twierdzenie, że nie trzeba instalować dodatkowych modułów uważam za śmieszne tak samo jak fakt, że najwyraźniej chyba nawet nie przyglądałeś się bliżej kodowi który wywala z siebie ionCube. Jest tam wyraźnie wykonywany dl() wraz ze sklejaniem ciągu z dll/so, który ma być wczytany.
Go to the top of the page
+Quote Post
nasty
post
Post #57





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


@splatch- masz racje, funkcje dl,system,exec itp. sa tylko na BARDO drogich dedykowanych serwerach, a na takie rowiazania stac tylko duze firmy. a te to maja zazwyczaj cale teamy tylko do twozenia zabezpiczen.

Ten post edytował nasty_psycho 21.06.2006, 08:15:08
Go to the top of the page
+Quote Post
SongoQ
post
Post #58





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
sa tylko na BARDO drogich dedykowanych serwerach

ta widze ze nie znasz terminu dedykowany serwer.
Go to the top of the page
+Quote Post
macbirdie
post
Post #59





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 7.09.2006
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(kszychu @ 26.01.2006, 16:46:57 ) *
to robi kod w ogóle nieczytelnym i nieedytowalnym.

Do samego tego wystarczy po prostu zatrudnić kiepskiego programistę. (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)

Sorry, NMSP. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

IonCube lub Zend Encoder. Nie ma co kombinować, tym badziej że zazwyczaj jeśli aplikacja jest robiona dla klienta i kod jest na tyle wartościowy, że go nie powinien zobaczyć/móc powielić, to i tak to ma na swoich serwerach, tym samym może sobie wszelkie rozszerzenia doinstalowywać.

Inna kwestia - umowa o udostępnienie kodu może mówić jednoznacznie, że nie można wykorzystać go w innych, własnych celach czy odsprzedawać dalej, a jak ktoś łamie licencję, to do sądu - toż to zwykłe piractwo.

Ten post edytował macbirdie 11.09.2006, 11:42:45
Go to the top of the page
+Quote Post

3 Stron V  < 1 2 3
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.01.2026 - 03:23